<?php
/**
  * IBD - Projet Helvetia - 2009
  *
  * Alexandre DOS SANTOS COELHO
  * Mathieu RICHARD
  * Karim EL-ALAILI
  * Julien REBETEZ
  *
  */

/**
 * Modele pour les evenements
 * @package modeles
 */
class Event extends AppModel
{
  var $name = 'Event';

  //On gere la validation du titre et des deux champs dates ici, la fonction beforeSave retournera
  //false si la date de debut est posterieur a celle de fin
  var $validate = array (
        'title' => array('rule' => array('between', 1, 50), 'message' => "Veuillez entrer un titre"),
        'startDateOnly' => array('rule' => array('date', 'mdy'), 'message' => 'Date invalide'),
        'endDateOnly' => array('rule' => array('date', 'mdy'), 'message' => 'Date invalide')
      );
  /**
   * Un evenement peut etre lie ("appartenir") a plusieurs fichiers.
   * De meme, un fichier peut etre lie a plusieurs evenements
   */
  var $hasAndBelongsToMany = array (
        'Upload' => array('className' => 'Upload',
                          'joinTable' => 'attachment',
                          'foreignKey' => 'event_id',
                          'associationForeignKey' => 'upload_id')
      );

  /**
   * Genere des champs utilise par les vues
   * ['Event']['startDateOnly']
   * ['Event']['start']['hour'] 
   * ['Event']['start']['min']
   * ['Event']['end']['hour'] 
   * ['Event']['end']['min'] 
   * @param $results le tableau dans lequel generer les champs
   * @param $fieldname est soit 'start', soit 'end'
   * @return le tableau avec les champs generes
   */
  function _handleAfterFindDate ($results, $fieldname) {
    foreach ($results as $key => $val) {
      if (isset($val['Event'][$fieldname.'Date'])) {
        $strdate = strtotime($val['Event'][$fieldname.'Date']);
        $results[$key]['Event'][$fieldname.'DateOnly'] = date('m-d-Y', $strdate);
        $results[$key]['Event'][$fieldname]['hour'] = date('H', $strdate);
        $results[$key]['Event'][$fieldname]['min'] = date('i', $strdate);
      }
    }
    return $results;
  }

  /**
   * Methode execute apres chaque SELECT concernant ce modele
   * C'est ici qu'on cree les champs "fictifs" pour la gestion des dates/heures
   * @param $results le tableau de resultats a modifier
   * @return le tableau de resultats modifie
   */
  function afterFind($results) {
    //creation de pseudochamps
    $results = $this->_handleAfterFindDate($results, 'start');
    $results = $this->_handleAfterFindDate($results, 'end');

    return $results;
  }

  /**
   * Convertit une date en timestamp UNIX (via mktime())
   * $fieldname est soit 'start' soit 'end' selon qu'on doit convertir
   *            startDate ou endDate
   * @return un timestamp UNIX
   */
  function _convertDateToTime ($fieldname) {
    $timestamp = strtotime(str_replace('-','/',$this->data['Event'][$fieldname.'DateOnly']));
    $month = date('m', $timestamp);
    $day = date('d', $timestamp);
    $year = date('Y', $timestamp);

    return mktime(
        $this->data['Event'][$fieldname]['hour'],
        $this->data['Event'][$fieldname]['min'],
        null,
        $month,
        $day,
        $year);
  }

  /**
   * Reuni les champs fictifs en un champ DATETIME 
   * Modifie $this->data
   * $fieldname est soit 'start' soit 'end' selon qu'on traite startDate ou endDate
   */
  function _handleBeforeSaveDate ($fieldname) {
    $this->data['Event'][$fieldname.'Date'] = date('Y-m-d H:i:s', $this->_convertDateToTime($fieldname));
  }

  /**
   * Methode execute avant chaque UPDATE/INSERT
   * S'occupe de reunir les champs fictifs dans des champs DATETIME startDate et endDate
   */
  function beforeSave () {
    $this->_handleBeforeSaveDate('start');
    $this->_handleBeforeSaveDate('end');

    //On verifie que la date de fin est plus tard que la date de debut
    if ($this->data['Event']['startDate'] >= $this->data['Event']['endDate']) {
      $this->invalidate('startDate', "Date de fin précède date de début");
      $this->invalidate('endDate', "Date de fin précède date de début");
      return false;
    }
  
    return true;
  }
}
?>
